package farmaweb

import grails.test.*

class ClienteTests extends GrailsUnitTestCase {

    void testarCriacaoUmCliente() {
        // Testa a criação de um cliente:
       def umCliente = this.getClienteOK()
       mockForConstraintsTests(Cliente, [umCliente])
        // Garante que o cliente não é nulo:
        assertNotNull umCliente
       // Valida as constraints do cliente contra o SGBD:
       assert umCliente.validate()
    }

    void testarValoresNulos() {
        // Primeiro, obtem um cliente com todos os dados corretamente preenchidos:
        def umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])

        /* Testa dados nulos em campos que não os permitem: */
        umCliente.cnpj = null
        shouldFail { umCliente.validate() }
        umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])

        umCliente.razaoSocial = null
        shouldFail { umCliente.validate() }
    }

    void testarValoresEmBranco() {
        // Primeiro, obtem um cliente com todos os dados corretamente preenchidos:
        def umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])

        /* Testa dados em branco em campos que não os permitem: */
        umCliente.cnpj = ''
        shouldFail { umCliente.validate() }
        umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])

        umCliente.razaoSocial = ''
        shouldFail { umCliente.validate() }
        umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])

        umCliente.complemento = ''
        shouldFail { umCliente.validate() }
    }

    void testarValoresMaioresQueTamanhoMaximo() {
        /*
         Testa estouro nos tamanhos máximos de cada atributo. Para cada atributo, é fornecido um valor maior que o
         tamanho daquele, em seguida, é chamada a validação (que deve falhar) e o objeto recebe novamente o valor sem
         erros para o teste do próximo atributo.
        */
        def umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])
        umCliente.cnpj = '71.221.068/0001-490'
        shouldFail { umCliente.validate() }
        umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])
        umCliente.razaoSocial = 'Esta é uma imensa razão social, cujo objetivo é testar uma constraint.'
        umCliente.razaoSocial = umCliente.razaoSocial + 'Este texto deve possuir mais de 50 caracteres'
        shouldFail { umCliente.validate() }
        umCliente = this.getClienteOK()
        mockForConstraintsTests(Cliente, [umCliente])
    }

    void testarCnpjInvalido() {
        def umCliente = this.getClienteOK()
        umCliente.cnpj = '71.221.068/1001-49'
        shouldFail { umCliente.validate() }
    }

    // Retorna um cliente válido:
    private Cliente getClienteOK() {
        def cliente = new Cliente(razaoSocial: 'Indústrias Reunidas Barro na Louça', cnpj: '71.221.068/0001-49',
                inscricaoEstadual: '123456789', fone: '(81)3000-1234', fax: '(81)3000-1234',
                email: 'abx@xyz.com', pessoaContato: 'Fulano de Tal',
                logradouro: 'Rua ABCDEF', numero: '1234', complemento: '',
                bairro: 'Bairro Novo', cidade: 'Olinda', uf: 'PE', cep: '51190-130')
        return cliente
    }

}
